#!/bin/env python
import argparse
from scipy.optimize import minimize
import numpy as np

# 定义方程，传入的 vars 是包含 LINEW 和 INLINEW 的数组
def equation(vars, FWHM_target):
    L, G = vars
    FWHM_lorentz = 2 * L  # 计算 FWHM_lorentz
    FWHM_gauss = 2.355 * G  # 计算 FWHM_gauss
    FWHM_voigt = 0.5346 * FWHM_lorentz + np.sqrt(0.2166 * FWHM_lorentz**2 + FWHM_gauss**2)  # 计算 FWHM_voigt
    return FWHM_voigt - FWHM_target  # 返回 FWHM_voigt 与目标值的差值

# 创建 ArgumentParser 对象
parser = argparse.ArgumentParser(description="计算给定 FWHM_voigt 的 LINEW 和 INLINEW")

# 添加 FWHM_voigt 参数，单位为纳米
parser.add_argument("FWHM_voigt_nm", type=float, help="目标 FWHM_voigt 值，单位为纳米 (nm)")

# 解析传入的参数
args = parser.parse_args()

# 将 FWHM_voigt 从纳米转换为厘米倒数 (cm^-1)
# 1 纳米 (nm) = 1e-7 厘米 (cm)，所以 1 nm^-1 = 1e7 cm^-1
FWHM_target = 1e7/args.FWHM_voigt_nm

# 初始猜测值
initial_guesses = [50000, 50000]

# 定义边界以确保值为正
bounds = [(0, None), (0, None)]

# 使用最小化函数来解决方程，并传入目标 FWHM_voigt 值
result = minimize(lambda vars: abs(equation(vars, FWHM_target)), initial_guesses, bounds=bounds)

# 获取解
solution = result.x

# 打印解
LINEW, INLINEW = solution
print(f"LINEW ≈ {LINEW:.2f}")
print(f"INLINEW ≈ {INLINEW:.2f}")

